package com.tfy.liquor.util.poi;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;


/**
 * 导出Excel
 *
 * @param <T>
 * @author liuyazhuang
 */
public class ExportExcelUtil<T> {
    /**
     * @param response 写入响应
     * @param map      数据对应的列名
     * @param list     数据源
     * @param title    抬头标题
     * @param tableName     表格名称
     */
    public static void exportExcel(HttpServletResponse response, Map<String, String> map, List list, String title, String tableName) {
        // 通过工具类创建writer，默认创建xls格式
//        ExcelWriter writer = ExcelUtil.getWriter();
        ExcelWriter writer = new ExcelWriter(true);
        //自定义标题别名
        java.util.Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
//            entry.getKey();      //返回对应的键
//            entry.getValue();   //返回对应的值
            writer.addHeaderAlias((String) entry.getKey(), (String) entry.getValue());
        }
        // 合并单元格后的标题行，使用默认标题样式
        if (null != title) {
            // 自动根据列大小合并单元格，并添加抬头内容
            writer.merge(map.size() - 1, title);
        }
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(list, true);
        //out为OutputStream，需要写出到的目标流
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = format.format(new Date());
        response.setHeader("Content-Disposition", "attachment;filename=" + tableName + "-" + time + ".xlsx");
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            writer.flush(out, true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭writer，释放内存
            writer.close();
        }
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }
    // 导出默认数据，不单独设置列名称
    public static void exportExcel(HttpServletResponse response, List list, String tableName) {
        // 通过工具类创建writer，默认创建xls格式
//        ExcelWriter writer = ExcelUtil.getWriter();
        ExcelWriter writer = new ExcelWriter(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(list, true);
        //out为OutputStream，需要写出到的目标流
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = format.format(new Date());
        response.setHeader("Content-Disposition", "attachment;filename=" + tableName + "-" + time + ".xlsx");
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            writer.flush(out, true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭writer，释放内存
            writer.close();
        }
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }

}
